home *** CD-ROM | disk | FTP | other *** search
/ Games of Daze / Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso / x2ftp / msdos / libs / 3dvect39 / game.asm < prev    next >
Assembly Source File  |  1994-10-30  |  6KB  |  234 lines

  1. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  2. ;
  3. ; Filename     : Game.asm
  4. ; Included from: Main Assembley module
  5. ; Description  : Generic gaming routines
  6. ;
  7. ; Written by: John McCarthy
  8. ;             1316 Redwood Lane
  9. ;             Pickering, Ontario.
  10. ;             Canada, Earth, Milky Way (for those out-of-towners)
  11. ;             L1X 1C5
  12. ;
  13. ; Internet/Usenet:  BRIAN.MCCARTHY@CANREM.COM
  14. ;         Fidonet:  Brian McCarthy 1:229/15
  15. ;   RIME/Relaynet: ->CRS
  16. ;
  17. ; Home phone, (905) 831-1944, don't call at 2 am eh!
  18. ;
  19. ; John Mccarthy would really love to work for a company programming Robots
  20. ; or doing some high intensive CPU work.  Hint. Hint.
  21. ;
  22. ; Send me your protected mode source code!
  23. ; Send me your Objects!
  24. ; But most of all, Send me a postcard!!!!
  25. ;
  26. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  27.  
  28.          .386p
  29.          jumps
  30.  
  31. code32   segment para public use32
  32.          assume cs:code32, ds:code32
  33.  
  34.          include pmode.ext                  ; protected mode externals by TRAN
  35.          include 3d.ext
  36.          include xmode.ext
  37.          include function.ext
  38.  
  39.          include font.ext
  40.  
  41.          include macros.inc
  42.          include equ.inc
  43.  
  44.          public _determine_volume
  45.          public _determine_panning
  46.  
  47.          public _rnd
  48.  
  49. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  50. ; Determine GUS & SB volume for object
  51. ; In:
  52. ;    EBX - relative x point of object to determine left/right sound panning of
  53. ;    ECX - relative y point
  54. ;    EBP - relative z point
  55. ; Out:
  56. ;    AL = volume (distance 0-15)
  57. ; Notes:
  58. ;  A call to _setsincose MUST have taken place for this routine to work
  59. ;  correctly!  This point you wish to determine panning  for   must  be
  60. ;  relative to the camera.  Eg: subtract camera location before call.
  61. ;
  62. ;  If your runing a SB:
  63. ;   mov esi,object #
  64. ;   call _get_location
  65. ;   call _subtract_camera
  66. ;   call _determine_volume
  67. ;   mov bl,al               ; <=
  68. ;   call _play_sample
  69. ;
  70. ;  If your runing a GUS:
  71. ;   mov esi,object #
  72. ;   call _get_location
  73. ;   call _subtract_camera
  74. ;   call _determine_volume
  75. ;   call _determine_panning ; <= this also works with SB, but calculation is useless
  76. ;   call _play_sample
  77. ;
  78. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  79.  
  80. _determine_volume:
  81.          mov eax,ebx                        ; find largest distance
  82.          or eax,eax
  83.          jge s dpno_neg1
  84.          neg eax
  85. dpno_neg1:
  86.          mov esi,ecx
  87.          or esi,esi
  88.          jge s dpno_neg2
  89.          neg esi
  90. dpno_neg2:
  91.          mov edi,ebp
  92.          or edi,edi
  93.          jge s dpno_neg3
  94.          neg edi
  95. dpno_neg3:
  96.          add eax,edi
  97.          add eax,esi
  98.  
  99.          shr eax,div_256+13
  100.          cmp eax,15
  101.          jge dp_novolumeanyway              ; no volume, no need for pan calculation
  102.  
  103.          and al,0fh
  104.          xor al,0fh
  105.  
  106.          ret
  107.  
  108. dp_novolumeanyway:
  109.          xor eax,eax
  110.          xor ebx,ebx
  111.          ret
  112.  
  113. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  114. ; Determine GUS panning for object
  115. ; In:
  116. ;    EBX - relative x point of object to determine left/right sound panning of
  117. ;    ECX - relative y point
  118. ;    EBP - relative z point
  119. ;    AX = volume (distance 0-15, from routine above)
  120. ; Out:
  121. ;    BH = panning position (0-15)
  122. ;    BL = volume after distance adjust (0-15)
  123. ; Notes:
  124. ;  A call to _setsincose MUST have taken place for this routine to work
  125. ;  correctly!  This point you wish to determine panning  for   must  be
  126. ;  relative to the camera.  Eg: subtract camera location before call.
  127. ;
  128. ;  Total time: 8 multiplies, 1 divide.
  129. ;
  130. ;  Done bother to call this routine if you have a SB, as SB doesnt have
  131. ;  left/right anyway.
  132. ;
  133. ;  The panning routine aborts if the volume is zero!
  134. ;
  135. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  136.  
  137. _determine_panning:
  138.          or ax,ax
  139.          jz _ret
  140.  
  141.          push ax
  142.  
  143.          if div_256 eq 8
  144.          shr ebx,8                          ; account for decimal places
  145.          test ebx,00800000h
  146.          jz s pm_1
  147.          or ebx, 0ff000000h
  148. pm_1:
  149.          shr ecx,8
  150.          test ecx,00800000h
  151.          jz s pm_2
  152.          or ecx, 0ff000000h
  153. pm_2:
  154.          shr ebp,8
  155.          test ebp,00800000h
  156.          jz s pm_3
  157.          or ebp, 0ff000000h
  158. pm_3:
  159.          endif
  160.  
  161.          call _zsolve
  162.          call _xsolve
  163.  
  164.          pop bx
  165.  
  166.          dec esi                            ; prevent z = 0
  167.          add esi,1
  168.          adc esi,0
  169.          cmp esi,0
  170.          jge s dp_noneg
  171.          neg esi
  172.  
  173.          mov eax,esi
  174.          shr eax,div_256+13
  175.          cmp al,3
  176.          jbe dp_nox
  177.          mov al,03h
  178. dp_nox:
  179.          inc al
  180.          sub bl,al                          ; if sound is behind, decrease volume
  181.          jnc dp_noneg
  182.          xor ebx,ebx
  183.          ret                                ; no volume anyway
  184. dp_noneg:
  185.          call _make3dx
  186.  
  187.          mov eax,edi
  188.          neg eax
  189.          add eax,32
  190.          shr eax,4+div_256/4
  191.  
  192.          add ax,8                           ; panning center (balance control)
  193.  
  194.          mov bh,0
  195.          cmp ax,0
  196.          jl _ret
  197.          mov bh,15
  198.          cmp ax,15
  199.          jg _ret
  200.          mov bh,al
  201.          ret
  202.  
  203. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  204. ; Randomize number
  205. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  206.  
  207. randomnumber    dd 5fe6c809h
  208.  
  209. _rnd:
  210.          xor eax,randomnumber
  211.          xor eax,edx
  212.          xchg al,ah
  213.          add eax,0cd9c9a8fh
  214.          xor eax,esi
  215.          add eax,edi
  216.          xor eax,0526dafb2h
  217.          add eax,ecx
  218.          xor eax,ebx
  219.          add eax,ebp
  220.          mov randomnumber,eax
  221.          in al,64
  222.          shl eax,8
  223.          in al,65
  224.          shl eax,8
  225.          in al,64
  226.          shl eax,8
  227.          in al,64
  228.          add randomnumber,eax
  229.          mov eax,randomnumber
  230.          ret
  231.  
  232.          ends
  233.          end
  234.